/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package station;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.MulticastSocket;

/**
 *
 * @author safe
 */
public class Sender extends Thread {

    public static final int SLOT_DAUER_MILLIS = 40;
    public static final int SENDE_PUFFER = 0;
    private final MulticastSocket multicastSocket;

    public Sender(MulticastSocket multicastSocket) {
        this.multicastSocket = multicastSocket;
    }

    private String extractMessageStationInfo(byte[] message) {
        byte[] stationInfo = new byte[10];
        System.arraycopy(message, 0, stationInfo, 0, 10);
        return new String(stationInfo);
    }

    /*
     *Nachricht aus Datenstruktur nehmen
     *Timestamp machen und rausschicken
     */
    @Override
    public void run() {
        try {
            int nextSlot = DataSlotBelegung.getOurNextSlot();
            if (istAufInitialwert(nextSlot)) {
                DataSlotBelegung.calculateNextFreeSlot();
                nextSlot = DataSlotBelegung.getOurNextSlot();
            }
            // was passiert wenn sendepuffer negativ wird?
            // Soll der eigentlich positiv oder negativ sein?
            // Ist das nicht eigentlich eine Konstante mit ihr rumspielt?
            long millisBisZumSenden = (nextSlot * SLOT_DAUER_MILLIS) + SENDE_PUFFER;
            wartenAufSendeZeitInnerhalbMeinesFrames(millisBisZumSenden);
            // Hat diese Variable nicht die selbe Bedeutung wie "nextSlot"?
            // Sie hat jedenfalls den selben Wert.
            // Zwei Variablen mit der selben Beudeutung (vielleicht?) sind eine
            // mögliche Fehlerquelle
            DataSlotBelegung.calculateNextFreeSlot();
            int uebernaechsterSlot = DataSlotBelegung.getOurNextSlot();
            DataNaechsteNachricht.setSlot(uebernaechsterSlot);
            long sendingTime = DataNaechsteNachricht.setMessageTimestamp();


            DatagramPacket data = DataNaechsteNachricht.getNextMessage();
            multicastSocket.send(data);
//            if (DataEmpfangeneNachrichten.collisionDetect(sendingTime)) {
//                if(!DataEmpfangeneNachrichten.collisionWithUs(extractMessageStationInfo(data.getData()))){         
//                    DataSlotBelegung.setSlotFree(uebernaechsterSlot);
//                    DataEmpfangeneNachrichten.setSendingCollision(true);
//                }
//            }
        } catch (IOException ex) {
            System.out.println("IOException beim Sender: " + ex.getMessage());
        } catch (InterruptedException ex) {
            System.out.println("InterruptedException beim Sender: " + ex.getMessage());
        }

    }

    private void wartenAufSendeZeitInnerhalbMeinesFrames(long millisBisZumSenden) throws InterruptedException {
        if (millisBisZumSenden >= 0) {
            sleep(millisBisZumSenden);
        }
    }

    private boolean istAufInitialwert(int nextSlot) {
        return nextSlot < 0;
    }
}
